你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/71484312
本文主要讲解Java8 Stream API
,但是要讲解这一部分需要匿名内部类、lambda表达式以及函数式接口的相关知识,本文将分为两篇文章来讲解上述内容,读者可以按需查阅。
本文是该系列博文的第一篇Java 匿名内部类、lambda表达式与函数式接口,主要讲解Java
的匿名内部类
、lambda表达式
以及函数式接口
,第二篇文章Java Stream API主要讲解Java Stream API
。
匿名内部类
匿名内部类
适用于那些只需要使用一次的类,比如设计模式下的命令模式,往往通过定义一系列接口进行调用,有时有的命令只会执行一次就不再执行,这个时候如果单独定义一个类就显得过于复杂并且编译会生成这个类的.class
文件,不利于管理,这种情况下使用匿名内部类
就能够很好的简化编程并且不会编译生成单独的.class
文件。
接下来看一个例子:
interface Programmer
{
void listLanguages();
void introduceMyself();
}
class MyProgrammer implements Programmer
{
public void listLanguages() {
System.out.println("Objective-C Swift Python Go Java");
}
public void introduceMyself() {
System.out.println("My Name is Jiaming Chen");
}
}
public class HelloWorld
{
static void info(Programmer programmer)
{
programmer.listLanguages();
programmer.introduceMyself();
}
public static void main(String[] args)
{
info(new MyProgrammer());
}
}
上面这个例子为了执行info
函数定义了一个实现了Programmer
接口的类MyProgrammer
,如果它只执行一次这样就显得过于复杂,如果采用匿名内部类
就会在很大程度上简化编程,首先介绍一下匿名内部类
的基础语法:
new 需要实现的接口() | 父类构造器()
{
//需要实现的方法或重载父类的方法
}
匿名内部类
的语法很简单,必须要实现一个接口或者继承一个类,可以看到使用了new
关键词,因此在创建匿名内部类
的同时会创建一个该类的实例,并且只能创建一个实例,创建完成后这个匿名内部类
就不能再使用,因此,匿名内部类
不能是抽象类,由于匿名内部类
没有类名所以也不能定义构造函数,但是可以在定义匿名内部类
的时候调用父类的有参构造器也可以定义初始化块用于初始化父类的成员变量。下面这个栗子是将上述代码修改为匿名内部类
的实现方式:
class MyProgrammer implements Programmer
{
public void listLanguages() {
System.out.println("Objective-C Swift Python Go Java");
}
public void introduceMyself() {
System.out.println("My Name is